package coreBiz

import (
	"database/sql/driver"
	"fmt"
	"strings"

	"github.com/goccy/go-json"
)

var EncryptStringAes *AesEcb128

type EncryptString string

// InitEncryptStringAes 需要初始化
func InitEncryptStringAes(key string) {
	EncryptStringAes = InitEncryptAesWithKeyIv(key)
}

// EncryptEncode 加密方法
func EncryptEncode(str string) string {
	if IsEmpty(str) {
		return ""
	}
	res, err := EncryptStringAes.EncryptECB(str)
	if err != nil {
		return ""
	}
	return res
}

// DecryptDecode 解密方法
func DecryptDecode(str string) string {
	if IsEmpty(str) {
		return ""
	}
	res, err := EncryptStringAes.DecryptECB(str)
	if err != nil {
		return ""
	}
	return res
}

// Value 重写写入数据库的值的方法
func (e EncryptString) Value() (driver.Value, error) {
	encryptedStr := EncryptEncode(string(e))
	return encryptedStr, nil
}

// Scan 重写读取数据库的值解密的方法
func (e *EncryptString) Scan(value interface{}) error {
	if value == nil {
		*e = ""
		return nil
	}
	decryptedStr := DecryptDecode(fmt.Sprintf("%s", value))
	*e = EncryptString(decryptedStr)
	return nil
}

// MarshalBinary 实现 encoding.BinaryMarshaler,redis 写入用
func (e EncryptString) MarshalBinary() ([]byte, error) {
	if e == "" {
		return nil, nil
	}
	return []byte(e), nil
}

// UnmarshalBinary 实现 encoding.BinaryUnmarshaler redis 读取用
func (e *EncryptString) UnmarshalBinary(data []byte) error {
	if len(data) == 0 {
		*e = ""
		return nil
	}
	*e = EncryptString(data)
	return nil
}

// MarshalJSON 实现 json.Marshaler 接口，用于json序列化
func (e EncryptString) MarshalJSON() ([]byte, error) {
	if e == "" {
		return json.Marshal("")
	}
	encryptedStr := EncryptEncode(string(e))
	return json.Marshal(encryptedStr)
}

// UnmarshalJSON 实现 json.Unmarshaler 接口，用于json反序列化
func (e *EncryptString) UnmarshalJSON(data []byte) error {
	dataStr := strings.Trim(string(data), "\"")
	if len(dataStr) == 0 {
		*e = ""
		return nil
	}
	decryptedStr := DecryptDecode(dataStr)
	*e = EncryptString(decryptedStr)
	return nil
}

// IsEmpty 是否为空
func (e EncryptString) IsEmpty() bool {
	return IsEmpty(string(e))
}

// String 转为string
func (e EncryptString) String() string {
	return string(e)
}
